package com.eyas.im.protocol.decoder;

import com.eyas.im.protocol.protocol.StringProtocol;

import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;

/**
 * 非线程安全，一个client-server的channel对应一个实例
 */
public class StringDecoder implements Decoder<StringProtocol> {
    private ByteArrayOutputStream bytesCache = new ByteArrayOutputStream(); //用于缓存TCP半包的字节数据
    private final static byte PROTOCOL_DELIMITER = '\n'; //回车符认为输入结束，可以产生结果

    /**
     * 解码数据，每次遇到\n，就认为是一条数据，直接返回，bytebuffer是否需要继续消费还是重置，取决于handler
     * @param bytes
     * @return
     */
    @Override
    public StringProtocol decode(byte[] bytes) throws UnsupportedEncodingException {
        if(bytes!=null&&bytes.length>0) {
            StringProtocol stringProtocol = new StringProtocol();
            for(byte b:bytes) {
               bytesCache.write(b);
                if (b == PROTOCOL_DELIMITER) {
                    String result = bytesCache.toString("UTF-8");
                    stringProtocol.getMessage().add(result);
                    bytesCache.reset();
                }
            }

            if(bytesCache.size()==0) {
                //如果没有缓存数据，需要重新赋值bytesCache，因为ByteArrayOutputStream的capacity不会缩小
                bytesCache = new ByteArrayOutputStream();
            }
            return stringProtocol;
        }
        return null;
    }
}
